
// function test1() {
//   console.log('------------');
//   console.log(1);
//   console.log('++++++++++++');
// }
// function test2() {
//   console.log('------------');
//   console.log(2);
//   console.log('++++++++++++');
// }
// function test3() {
//   console.log('------------');
//   console.log(3);
//   console.log('++++++++++++');
// }

// test1();
// test2();
// test3();

// 面向切面编程
// -----------------------------------------------------------

// 直接执行函数
function test1() {
  // console.log('------------'); // before
  console.log(1);
  // console.log('++++++++++++'); // after
}

Function.prototype.before = function(callback) {
  // callback();
  // this();
  // 不返回this 后续执行不了
  // return this;
  
  // 采用闭包形式
  var _self = this;
  return function() { // 返回一个函数
    callback.apply(_self, arguments);
    _self.apply(_self, arguments);
  }
}
Function.prototype.after = function(callback) {
  // this(); // 链式  会执行两次 console.log(1);
  // callback();

  var _self = this; // this 指的就是这个返回的函数
  return function() {
    _self.apply(_self, arguments);
    callback.apply(_self, arguments);
  }
}

test1.before(() => {
  console.log('------------');
}).after(() => {
  console.log('++++++++++++');
})(); // 因为最后尾返回的是一个函数 所以要加() 来立即执行



// 带返回值
function test() {
  // console.log('------------'); // before
  console.log(1);
  // console.log('++++++++++++'); // after
  return 'AOP AOP AOP~'
}
Function.prototype.before = function(callback) {
  var _self = this;
  return function() {
    callback.apply(_self, arguments);
    return _self.apply(_self, arguments);
  }
}
Function.prototype.after = function(callback) {
  var _self = this;
  return function() {
    var result = _self.apply(_self, arguments);
    callback.apply(_self, arguments);
    return result;
  }
}

var aop = test.before(() => {
  console.log('------------'); 
}).after(() => {
  console.log('++++++++++++');
})();

console.log(aop);
